package com.ruoyi.system.media;

import java.util.Arrays;

/**
 * 双片式OBU交费信息文件(DF01/EF04)编码信息
 * 198bytes
 *
 * @author wuxi_twz
 */
public class ObuEf04EdModel {
    /**
     * 含全部信息文件长度
     */
    public static final int MSG_LEN1 = 198;

    /**
     * 不含分省信息文件长度
     */
    public static final int MSG_LEN2 = 91;

    /**
     * 用户卡0019文件前39BYTES((到nVSign))(315-353,39,bn)
     */
    public byte[] uc0019 = new byte[39];

    /**
     * 用户卡0015文件前20BYTES(到cCardsId)(354-373,20,bn)
     */
    public byte[] uc0015 = new byte[20];

    /**
     * 用户类型(374-374,1,n)
     * 写入0015文件第 41 字节
     */
    public byte[] nUserCls = new byte[1];

    /**
     * 全程累计省份数量(375-375,1,n)
     * 根据 OBU返回状态判断后累加写入。入口置 1 出口清 0
     */
    public byte[] nProvSum = new byte[1];

    /**
     * 全程累计应收金额(376-378,3,n)
     * 全程应收金额累计,单位：分
     */
    public byte[] cCoutTol = new byte[3];

    /**
     * 全程累计实收金额(379-381,3,n)
     * 全程实收金额累计,单位：分
     */
    public byte[] cFreeTol = new byte[3];

    /**
     * 全程累计成功次数(382-383,2,n)
     * ETC门架系统（含兼具门架功能的收费站入出口）根据 OBU返回状态判断后累加写入
     */
    public byte[] cDealSum = new byte[2];

    /**
     * 全程累计计费里程(384-386,3,n)
     * 单位米
     */
    public byte[] cMileSum = new byte[3];

    /**
     * 全程累计无卡次数(387-387,1,n)
     */
    public byte[] nNoneSum = new byte[1];

    /**
     * 本省入口编码(388-390,3,bn)
     * 入口收费站（写入 3 字节 0x00）或省界入口门架 HEX 码
     */
    public byte[] cEntyHex = new byte[3];

    /**
     * 本省累计应收金额(391-393,3,n)
     * 单位：分
     * ETC 门架系统（含兼具门架功能的收费站入出口）根据 OBU 返回状态判断后累加写入应收金额，进入下一省后重新计数
     */
    public byte[] cLoclTol = new byte[3];

    /**
     * 本省累计成功次数(394-394,1,n)
     * ETC 门架系统（含兼具门架功能的收费站入出口）根据 OBU 返回状态判断后累加写入，进入下一省后重新计数
     */
    public byte[] nLoclSum = new byte[1];

    /**
     * 本省累计实收金额(395-397,3,n)
     * ETC 门架系统（含兼具门架功能的收费站入出口）根据 OBU 返回状态判断后累加写入，进入下一省后重新计数
     */
    public byte[] cNullDat = new byte[3];

    /**
     * 加密摘要(398-405,8,bn)
     * 入出口默认为0x0000000000000000
     */
    public byte[] cMarkDat = new byte[8];

    /**
     * 通行省份累计实收金额(406-485,80,bn)
     * 顺序记录，每过一个省增加4个字节，格式为：AABBBBBB-AA为省份的BCD区号;BBBBBB-为改省累计实收金额(如：河南1分:0x41000001),最多记录20个分省信息
     */
    public byte[] cProvTol = new byte[80];

    /**
     * 保留(486-512,27,bn)
     */
    public byte[] spareDFEF04 = new byte[27];

    /**
     * 信息编码
     *
     * @param dd
     * @return
     */
    public static ObuEf04EdModel encoded(ObuEf04Model dd) {
        byte[] bz0019 = Ucard0019Ed39.encoded(dd.uc0019).toBytes();
        byte[] bz0015 = Ucard0015Ed20.encoded(dd.uc0015).toBytes();

        ObuEf04EdModel ed = new ObuEf04EdModel();
        ed.uc0019 = Arrays.copyOf(bz0019, 39);
        ed.uc0015 = Arrays.copyOf(bz0015, 20);
        ed.nUserCls = ZTools.int2bin(1, dd.nUserCls);
        ed.nProvSum = ZTools.int2bin(1, dd.provCount);
        ed.cCoutTol = ZTools.int2bin(3, dd.sumPayFee);
        ed.cFreeTol = ZTools.int2bin(3, dd.sumFee);
        ed.cDealSum = ZTools.int2bin(2, dd.sumOkCount);
        ed.cMileSum = ZTools.int2bin(3, dd.sumMile);
        ed.nNoneSum = ZTools.int2bin(1, dd.sumNCardCount);
        ed.cEntyHex = ZTools.hex2bin(3, dd.provEntyHex);
        ed.cLoclTol = ZTools.int2bin(3, dd.provSumPayFee);
        ed.nLoclSum = ZTools.int2bin(1, dd.provSumCount);
        ed.cNullDat = ZTools.int2bin(3, dd.provSumFee);
        ed.cMarkDat = ZTools.hex2bin(8, dd.cMarkDat);

        int index = 0;
        for (int aa = 0; aa < dd.provTolls.length; aa++) {
            ObuProvEd edProvToll = ObuProvEd.encoded(dd.provTolls[aa]);
            System.arraycopy(edProvToll.toBytes(), 0, ed.cProvTol, index, 4);
            index += 4;
        }

        return ed;
    }

    public byte[] toBytes() {
        byte[] ret = ZTools.sbMerger(uc0019, uc0015, nUserCls, nProvSum, cCoutTol, cFreeTol, cDealSum, cMileSum, nNoneSum, cEntyHex, cLoclTol, nLoclSum, cNullDat, cMarkDat, cProvTol, spareDFEF04);
        return ret;
    }

    public String toHexStr() {
        return ZTools.bin2hex(toBytes());
    }
}
